package br.com.fatecmc.recursoshidricos.core.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;

import br.com.fatecmc.core.dao.AbstractDAO;
import br.com.fatecmc.fatec.domain.Entidade;
import br.com.fatecmc.persephone.propriedade.domain.Propriedade;
import br.com.fatecmc.persephone.recursosHidricos.domain.RecursosHidricos;

public class DAORecursosHidricos extends AbstractDAO{

	@Override
	public void salvar(Entidade obj) throws IllegalArgumentException {
		try {
            Propriedade p = (Propriedade) obj;
            conexao.getConexao().createStatement(); 
            String sql =  "INSERT INTO tb_propriedades_rec_hidricos (" +
            		"id_propriedade, " +
            		"agua_disponivel_flg, " +
            		"consumo_maior_5m3_dia_flg, " +
            		"possui_doc_outorga_ou_isencao_flg, " +
            		"id_interv_analise_agua" +
            		") " +
            		"VALUES(?,?,?,?,?)";
            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
            pstm.setInt(1, p.getId());
            
            pstm.setBoolean(2, p.getRecursosHidricos().getAguaDisponivel());
            pstm.setBoolean(3, p.getRecursosHidricos().getConsumoMaior5m3Dia());
            pstm.setBoolean(4, p.getRecursosHidricos().getDocOutorgaOuIsencao());
            if( p.getRecursosHidricos().getIntervaloAnaliseAgua() != null){
        		sql = "SELECT id_intervalo FROM tba_intervalos_analise_agua WHERE descricao=?";
        		PreparedStatement pstm2 = conexao.getConexao().prepareStatement(sql);
        		pstm2.setString(1, p.getRecursosHidricos().getIntervaloAnaliseAgua());
                ResultSet rs2 = pstm2.executeQuery();
                rs2.next();
                Integer id = rs2.getInt("id_intervalo");
                if(id != null)
                	pstm.setInt(5, id);
                else
                	pstm.setString(5, null);
        	}else{
        		pstm.setString(5, null);
        	}
            pstm.executeUpdate();
            conexao.getConexao().close();
            pstm.close();
        } catch (SQLException ex) {
            Logger.getLogger(DAORecursosHidricos.class.getName()).log(Level.SEVERE, null, ex);
        }			
	}

	@Override
	public Entidade alterar(Entidade obj) {
		try {
            Propriedade p = (Propriedade) obj;
            conexao.getConexao().createStatement(); 
            String sql =  "UPDATE tb_propriedades_rec_hidricos SET " +
            		"agua_disponivel_flg=?, " +
            		"consumo_maior_5m3_dia_flg=?, " +
            		"possui_doc_outorga_ou_isencao_flg=?, " +
            		"id_interv_analise_agua=? " +
            		"WHERE id_propriedade=?";
            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
                       
            pstm.setBoolean(1, p.getRecursosHidricos().getAguaDisponivel());
            pstm.setBoolean(2, p.getRecursosHidricos().getConsumoMaior5m3Dia());
            pstm.setBoolean(3, p.getRecursosHidricos().getDocOutorgaOuIsencao());
            
            
            if( p.getRecursosHidricos().getIntervaloAnaliseAgua() != null){
        		sql = "SELECT id_intervalo FROM tba_intervalos_analise_agua WHERE descricao=?";
        		PreparedStatement pstm2 = conexao.getConexao().prepareStatement(sql);
        		pstm2.setString(1, p.getRecursosHidricos().getIntervaloAnaliseAgua());
        		ResultSet rs2 = pstm2.executeQuery();
        		rs2.next();
                Integer id = rs2.getInt("id_intervalo");
                pstm.setInt(4, id);
        	}else{
        		pstm.setString(4, null);
        	}
            pstm.setInt(5, p.getId());
            pstm.executeUpdate();
            conexao.getConexao().close();
            pstm.close();
            return p;
        } catch (SQLException ex) {
            Logger.getLogger(DAORecursosHidricos.class.getName()).log(Level.SEVERE, null, ex);
            return obj;
        }			
	}

	@Override
	public boolean excluir(Entidade obj) {
		try {
            Propriedade p = (Propriedade) obj;
            conexao.getConexao().createStatement(); 
            String sql =  "DELETE FROM tb_propriedades_rec_hidricos WHERE id_propriedade=?";
            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
            pstm.setInt(1, p.getId());
            pstm.executeUpdate();
            conexao.getConexao().close();
            pstm.close();
            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DAORecursosHidricos.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }					
	}

	@Override
	public Collection consultar(Entidade obj) {
		ArrayList<RecursosHidricos> lista = new ArrayList<RecursosHidricos>();
		
		try {
			String sql;
            Propriedade p = (Propriedade) obj;
            conexao.getConexao().createStatement(); 
            sql =  "SELECT * FROM tb_propriedades_rec_hidricos WHERE id_propriedade=?";
            PreparedStatement pstm = conexao.getConexao().prepareStatement(sql);
            pstm.setInt(1, p.getId());
            ResultSet rs = pstm.executeQuery();
            while(rs.next()){
            	
            	RecursosHidricos rh = new RecursosHidricos();
            	rh.setAguaDisponivel(rs.getBoolean("agua_disponivel_flg"));
            	rh.setConsumoMaior5m3Dia(rs.getBoolean("consumo_maior_5m3_dia_flg"));
            	rh.setDocOutorgaOuIsencao(rs.getBoolean("possui_doc_outorga_ou_isencao_flg"));
            	Integer id_intervalo = rs.getInt("id_interv_analise_agua");
            	if( id_intervalo != null){
            		sql = "SELECT descricao FROM tba_intervalos_analise_agua WHERE id_intervalo=?";
            		pstm = conexao.getConexao().prepareStatement(sql);
                    pstm.setInt(1, p.getId());
                    ResultSet rs2 = pstm.executeQuery();
                    rh.setIntervaloAnaliseAgua(rs2.getString("descricao"));
            	}else{
            		rh.setIntervaloAnaliseAgua("");
            	}
            	lista.add(rh);
            }
            conexao.getConexao().close();
            pstm.close();
            return lista;
        } catch (SQLException ex) {
            Logger.getLogger(DAORecursosHidricos.class.getName()).log(Level.SEVERE, null, ex);
            return lista;
        }				
	}
	
}
